package com.reactor.消息处理;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class Message1 {

	public static void main(String[] args) {
		//在调用 subscribe 方法时可以指定需要处理的消息类型。可以只处理其中包含的正常消息，也可以同时处理错误消息和完成消息。
		Flux.just(1, 2)
	        .concatWith(Mono.error(new IllegalStateException()))
	        .subscribe(System.out::println, System.err::println);

		//当出现错误时，有多种不同的处理策略。第一种策略是通过 onErrorReturn()方法返回一个默认值。在代码清单 16 中，当出现错误时，流会产生默认值 0.
		Flux.just(1, 2)
	        .concatWith(Mono.error(new IllegalStateException()))
	        .onErrorReturn(0)
	        .subscribe(System.out::println);

/*		//第二种策略是通过 switchOnError()方法来使用另外的流来产生元素。在代码清单 17 中，当出现错误时，将产生 Mono.just(0)对应的流，也就是数字 0。
		Flux.just(1, 2)
	        .concatWith(Mono.error(new IllegalStateException()))
	        .switchOnError(Mono.just(0))
	        .subscribe(System.out::println);

*/

		//第三种策略是通过 onErrorResume()方法来根据不同的异常类型来选择要使用的产生元素的流。在代码清单 18 中，根据异常类型来返回不同的流作为出现错误时的数据来源。因为异常的类型为 IllegalArgumentException，所产生的元素为-1。
		Flux.just("A", "B", "C")
	        .concatWith(Flux.error(new IndexOutOfBoundsException("下标越界啦！")))
	        .onErrorResume(e -> {
	            if (e instanceof IndexOutOfBoundsException) {
	                return Flux.just("X", "Y", "Z");
	            } else {
	                return Mono.empty();
	            }
	        })
	        .subscribe(System.out::println, System.err::println);

		System.out.println("-------------");
		//当出现错误时，还可以通过 retry 操作符来进行重试。重试的动作是通过重新订阅序列来实现的。在使用 retry 操作符时可以指定重试的次数。代码清单 19 中指定了重试次数为 1，所输出的结果是 1，2，1，2 和错误信息。
		Flux.just(1, 2)
	        .concatWith(Mono.error(new IllegalStateException()))
	        .retry(1)
	        .subscribe(System.out::println);
	}

}
